from abc import ABCMeta, abstractmethod

"""
设计要点：
    主题（Subject）：定义操作、活动、任务的接口类
    真实主题（RealSubject）：真正完成操作、活动、任务的具体类
    代理主题（ProxySubject）：代替真实主题完成操作、活动、任务的代理类

    真实主题与代理主题是一类对象，只不过是将真实主题传入代理主题，由代理主题做一些操作，在调用，使得对客户隐藏真实主题，
    有点中介模式、装饰模式的意味。
"""

class Subject(metaclass=ABCMeta):
    """主体类"""
    def __init__(self, name):
        self.__name = name

    def getName(self1):
        return self.__name

    @abstractmethod
    def request(self, content=""):
        pass


class RealSubject(Subject):
    """真实主题类"""
    def request(self, content):
        print("RealSubject todo something...")


class ProxySubject(Subject):
    """代理主题类"""
    def __init__(self, name, subject):
        super().__init__(name)
        self.__realSubject = subject

    def request(self, content=""):
        self.preRequest()
        if(self.__realSubject is not None):
            self.__realSubject.request(content)
        self.afterRequest()

    def preRequest(self):
        print("preRequest")

    def afterRequest(self):
        print("afterRequest")


def testProxy():
    realObj = RealSubject("RealSubject")
    proxyObj = ProxySubject("ProxySubject", realObj)
    proxyObj.request()


if __name__ == "__main__":
    testProxy()
